package com.mt.common.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.mt.common.core.security.LoginUser;
import com.mt.common.core.web.JsonResult;
import com.mt.common.core.web.PageParam;
import com.mt.common.system.entity.User;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;

import java.util.List;
import java.util.Map;

/**
 * 用户服务类
 * Created by wangfan on 2018-12-24 16:10
 */
public interface UserService extends IService<User> {

    /**
     * 根据账号查询用户
     */
    User getByUsername(String username);
    /**
     * 根据openID查询用户
     */
    LoginUser getByOpenID(String openId);
    /**
     * 根据id查询用户(关联查询)
     */
    User getFullById(Long eid);
    /**
     * 根据id查询用户
     */
    User getUserById(Long eid);
    /**
     * 查询用户角色和权限
     */
    User selectRoleAndAuth(User user);
    /**
     * 查询用户角色
     */
    public User selectRoles(User user);

    /**
     * 查询用户权限
     */
    User selectUserAuth(User user);

    /**
     * 关联分页查询用户
     */
    List<User> listPage(PageParam<User> page);

    /**
     * 关联查询全部用户
     */
    List<User> listAll(Map<String, Object> page);

    /**
     * 添加用户(包含角色)
     */
    boolean saveUser(User user);

    /**
     * 修改用户(包含角色)
     */
    boolean updateUser(User user);

    /**
     * 比较用户密码
     *
     * @param dbPsw    数据库存储的密码
     * @param inputPsw 用户输入的密码
     * @return boolean
     */
    boolean comparePsw(String dbPsw, String inputPsw);

    /**
     * md5加密用户密码
     */
    String encodePsw(String psw);

    /**
     * 查询所有User集合(只提取ID 和 Name)
     *
     */
    public List<User> findAllUsersWithIdName();

    public LoginUser loadFromCache(String username);

    public LoginUser loadFromCache(String username,boolean force) ;

    public void cache(LoginUser user);

    public void decache(String username);

    public void decache() ;

    public void resetCache(String username) ;

    public User getFullByUsername(String username) ;

    public List<User> getUserIdByRoleId(List<Long> roleIds);

    JsonResult updatePasswordByEid(Long eid, String oldPassword, String newPassword);

    JsonResult bindWx(String code,Long userId);

    JsonResult removeWx(Long userId);
}
